﻿using System;
namespace CalculatorApplication {
    class NumberManipulator {
        //按引用传递参数
        public void swap(ref int x, ref int y) {
            int temp;

            temp = x; /* 保存 x 的值 */
            x = y;    /* 把 y 赋值给 x */
            y = temp; /* 把 temp 赋值给 y */
        }

        //return 语句可用于只从函数中返回一个值。但是，可以使用 输出参数 来从函数中返回两个值。
        //输出参数会把方法输出的数据赋给自己，其他方面与引用参数相似。
        public void getValue(out int x) {
            int temp = 5;
            x = temp;
        }

        //提供给输出参数的变量不需要赋值。当需要从一个参数没有指定初始值的方法中返回值时，输出参数特别有用。请看下面的实例，来理解这一点：

        public void getManyValues(out int x, out int y) {
            Console.WriteLine("请输入第一个值： ");
            x = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请输入第二个值： ");
            y = Convert.ToInt32(Console.ReadLine());
        }

        static void Main(string[] args) {
            NumberManipulator n = new NumberManipulator();
            /* 局部变量定义 */
            int a = 100;
            int b = 200;

            Console.WriteLine("在交换之前，a 的值： {0}", a);
            Console.WriteLine("在交换之前，b 的值： {0}", b);

            /* 调用函数来交换值 */
            n.swap(ref a, ref b);

            Console.WriteLine("在交换之后，a 的值： {0}", a);
            Console.WriteLine("在交换之后，b 的值： {0}", b);

            /* 局部变量定义 */
            int c = 100;
            Console.WriteLine("在方法调用之前，c 的值： {0}", c);
            /* 调用函数来获取值 */
            n.getValue(out c);
            Console.WriteLine("在getValue方法调用之后，c 的值： {0}", c);


            int d, e;

            /* 调用函数来获取值 */
            n.getManyValues(out d, out e);

            Console.WriteLine("在方法调用之后，d 的值： {0}", d);
            Console.WriteLine("在方法调用之后，e 的值： {0}", e);

            Console.ReadLine();

        }
    }
}